package com.example.pojo;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * @ClassName: CommonJSONResult
 * @Description: 自定义响应数据结构 这个类是提供给门户，ios，安卓，微信商城用的
 *               门户接受此类数据后需要使用本类的方法转换成对于的数据类型格式（类，或者list） 其他自行处理 200：表示成功
 *               500：表示错误，错误信息在msg字段中 501：bean验证错误，不管多少个错误都以map形式返回
 *               502：拦截器拦截到用户token出错 555：异常抛出信息
 * @author liuwj3
 * @date 2018年11月25日 下午12:41:52
 *
 */
public class CommonJSONResult {
	/** 定义Jackson对象 */
	private static final ObjectMapper MAPPER = new ObjectMapper();

	/** 响应业务状态 */
	private Integer status;

	/** 响应消息 */
	private String msg;

	/** 响应中的数据 */
	private Object data;

	// 暂不使用
	private String ok;

	public static CommonJSONResult build(Integer status, String msg, Object data) {
		return new CommonJSONResult(status, msg, data);
	}

	public static CommonJSONResult ok(Object data) {
		return new CommonJSONResult(data);
	}

	public static CommonJSONResult ok() {
		return new CommonJSONResult();
	}

	public static CommonJSONResult errorMsg(String msg) {
		return new CommonJSONResult(500, msg, null);
	}

	public static CommonJSONResult errorMap(Object data) {
		return new CommonJSONResult(501, "error", data);
	}

	public static CommonJSONResult errorTokenMsg(String msg) {
		return new CommonJSONResult(502, msg, null);
	}

	public static CommonJSONResult errorException(String msg) {
		return new CommonJSONResult(555, msg, null);
	}

	public CommonJSONResult() {
	}

	public CommonJSONResult(Integer status, String msg, Object data) {
		super();
		this.status = status;
		this.msg = msg;
		this.data = data;
	}

	public CommonJSONResult(Object data) {
		super();
		this.status = 200;
		this.msg = "OK";
		this.data = data;
	}

	public Boolean isOK() {
		return this.status == 200;
	}

	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}

	/**
	 * @Description: 将json结果集转化为CommonJSONResult对象
	 * 				需要转化的对象是一个类
	 * @param jsonData 
	 * @param clazz
	 * @return
	 */
	public static CommonJSONResult formatToPojo(String jsonData, Class<?> clazz) {
		try {
			if (clazz == null) {
				return MAPPER.readValue(jsonData, CommonJSONResult.class);
			}
			JsonNode jsonNode = MAPPER.readTree(jsonData);
			JsonNode data = jsonNode.get("data");
			Object obj = null;
			if (clazz != null) {
				if (data.isObject()) {
					obj = MAPPER.readValue(data.traverse(), clazz);
				} else if (data.isTextual()) {
					obj = MAPPER.readValue(data.asText(), clazz);
				}
			}
			return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
		} catch (Exception e) {
			return null;
		}
	}

}
